
import _ from 'lodash';
import Promise from 'promise';
import logger from './logger';
import { UserProxy } from '../proxy';
import * as Message from './message';

export {
  fetchUsers,
  sendMessageToMentionUsers,
  linkUsers
}

/**
 * 从文本中提取出@username 标记的用户名数组
 * @param {String} text 文本内容
 * @return {Array} 用户名数组
 */
function fetchUsers(text) {
  if (!text) {
    return [];
  }

  const ignoreRegexs = [
    /```.+?```/g, // 去除单行的 ```
    /^```[\s\S]+?^```/gm, // ``` 里面的是 pre 标签内容
    /`[\s\S]+?`/g, // 同一行中，`some code` 中内容也不该被解析
    /^ {4}.*/gm, // 4个空格也是 pre 标签，在这里 . 不会匹配换行
    /\b\S*?@[^\s]*?\..+?\b/g, // somebody@gmail.com 会被去除
    /\[@.+?\]\(\/.+?\)/g, // 已经被 link 的 username
  ];

  ignoreRegexs.forEach((ignore_regex) => {
    text = text.replace(ignore_regex, '');
  });

  const results = text.match(/@[a-z0-9\-_]+\b/igm);
  let names = [];
  if (results) {
    for (let i = 0, l = results.length; i < l; i++) {
      let s = results[i];
      // remove leading char @
      s = s.slice(1);
      names.push(s);
    }
  }
  names = _.uniq(names);
  return names;
}

/**
 * 根据文本内容中读取用户，并发送消息给提到的用户
 * Callback:
 * - err, 数据库异常
 * @param {String} content 文本内容
 * @param {String} topicId 主题ID
 * @param {String} authorId 作者ID
 * @param {String} replyId 回复ID
 */
async function sendMessageToMentionUsers(appId, content, topicId, authorId, replyId) {
  if (!appId || !content || !authorId || !topicId) {
    logger.debug(('sendMessageToMentionUsers').red, `${appId}&${topicId}&${authorId}&${replyId}`);
    return;
  }

  replyId = !replyId ? null : replyId;

  const names = fetchUsers(content);

  if (names.length === 0) {
    return Promise.resolve();
  }

  try {
    let users = await UserProxy.findByNames(appId, names);
    if (users && users.length > 0) {
      users = users.filter((user) => {
        if (!user) return false;
        !user._id.equals(authorId);
      });

      for (let i = 0; i < users.length; i++) {
        await Message.sendAtMessage(users[i]._id, authorId, topicId, replyId);
      }
    }
  } catch (err) {
    logger.error(err);
  }

  return Promise.resolve();
}

/**
 * 根据文本内容，替换为数据库中的数据
 * Callback:
 * - err, 数据库异常
 * - text, 替换后的文本内容
 * @param {String} text 文本内容
 * @param {Function} callback 回调函数
 */
function linkUsers(text) {
  const users = fetchUsers(text);
  for (let i = 0, l = users.length; i < l; i++) {
    const name = users[i];
    text = text.replace(new RegExp(`@${name}\\b(?!\\])`, 'g'), `[@${name}](/user/${name})`);
  }
  return text;
}
